package com.bw.aop;

import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//@Component
//@Aspect
public class MyAOP {

    /**
     * 前置通知
     * @param joinPoint
     * 切入点表达式 ：用来匹配方法名 ， 被匹配到的方法名 会被植入代码
     *  如果某个方法被表达式匹配到 ，这个方法所在对象，会变成代理对象 ，从容器中获取这个对象的时候，会得到一个代理对象
     */
    @Before("execution(    * com.bw.service.*.*(..) )")
    public void  before(JoinPoint joinPoint){

        System.out.println(joinPoint.getSignature().getName() + "入参是" + JSON.toJSONString(joinPoint.getArgs()));
    }

    //后置增强，方法正常退出时执行
    @AfterReturning(value = "execution(    * com.bw.service.*.*(..) )", returning = "obj")
    public void afterRunning(JoinPoint joinPoint,Object obj) {
        System.out.println(joinPoint.getSignature().getName() + "返回值是 " + JSON.toJSONString(obj));
    }

    //异常抛出增强
    @AfterThrowing("execution(    * com.bw.service.*.*(..) )")
    public void afterThrow() {
        System.out.println("----@AfterThrowing 异常时执行------");
    }

    //final增强，不管是抛出异常或者正常退出都会执行
    @After("execution(    * com.bw.service.*.*(..) )")
    public void afterFinal() {
        System.out.println("----@After 最后一定会执行------");
    }
}
